#ifndef CHATDIALOG_H
#define CHATDIALOG_H

#include "global.h"
#include "statewidget.h"
#include "userdata.h"

#include <QMap>
#include <QListWidgetItem>
#include <QDialog>
#include <QMouseEvent>

namespace Ui {
class ChatDialog;
}

// 聊天界面类 TODO
class ChatDialog : public QDialog
{
    Q_OBJECT

public:
    explicit ChatDialog(QWidget *parent = nullptr);
    ~ChatDialog();

    // 测试加载用户列表的功能 TODO
    // void addChatUserListItem();
    void clearLabelState(StateWidget* lb);

    void closeFindDlg();

    // 当处于搜素模式下，鼠标点击搜素区域之外的区域就需要清空搜素区域
    void handleGlobalMousePress(QMouseEvent* event);

    void updateChatMsg(QVector<std::shared_ptr<TextChatData>> msgdata);

protected:
    bool eventFilter(QObject *watched, QEvent *event) override;

private:
    // 进行ChatDialog显示的切换
    void showSearch(bool b_search = false);

    void addLbGroup(StateWidget* lb);
    // 设置当前Item为被点击选中的条目
    void setSelectChatItem(int uid = 0);
    // 设置当前与当前用户的聊天页面
    void setSelectChatPage(int uid = 0);
    // 添加好友列表的条目
    void addChatUserList();
    // 加载更多的好友条目
    void loadMoreChatUser();
    // 加载更多的联系人
    void loadMoreConUser();


public slots:
    // 处理加载新用户的信号(到滚动条到达底部后，开始加载剩下的用户)
    void slot_loading_chat_user();
    // 处理加载新联系人的信号(到滚动条到达底部后，开始加载剩下的联系人)
    void slot_loading_contact_user();
    void slot_side_chat();
    void slot_side_contact();
    void slot_text_changed(const QString& str);
    // 处理申请好友的信号
    void slot_apply_friend(std::shared_ptr<AddFriendApply> apply);
    // 处理添加好友时的信息检验
    void slot_add_auth_friend(std::shared_ptr<AuthInfo> auth_info);
    // 处理好友检验的会包
    void slot_auth_rsp(std::shared_ptr<AuthRsp> auth_rsp);
    // 处理从好友申请界面跳转到聊天界面的信号12q2w
    void slot_jump_chat_item(std::shared_ptr<SearchInfo> search_info);
    // 处理用户信息显示的跳转信号
    void slot_friend_info_page(std::shared_ptr<UserInfo> user_info);
    // 处理切换到好友申请界面的信号 进行页面跳转
    void slot_switch_apply_friend_page();
    // 处理从好友信息界面切换到聊天界面的信号 进行页面跳转
    void slot_jump_chat_item_from_infopage(std::shared_ptr<UserInfo> user_info);
    // 处理条目被点击的信号
    void slot_item_clicked(QListWidgetItem *item);
    // 处理缓存最新的聊天消息的信号
    void slot_append_send_chat_msg(std::shared_ptr<TextChatData> msgdata);
    // 处理提示有新发送过来的消息的信号
    void slot_text_chat_msg(std::shared_ptr<TextChatMsg> msg);

private:
    Ui::ChatDialog *ui;
    QWidget* m_last_widget;
    ChatUIMode m_mode;
    ChatUIMode m_state;
    bool m_b_loading;
    int m_cur_chat_uid; // 当前正在聊天的uid
    QMap<int, QListWidgetItem*> m_chat_items_added; // 好友聊天界面的条目
    QList<StateWidget*> m_lb_list;
};

#endif // CHATDIALOG_H
